package com.zhupf.part5;

/**
 * @author zhupf
 * @date 2023年11月07日 9:46
 * @Description
 * 给你一个未排序的整数数组 nums ，请你找出其中没有出现的最小的正整数。
 *
 * 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
 *
 *
 * 示例 1：
 *
 * 输入：nums = [1,2,0]
 * 输出：3
 * 示例 2：
 *
 * 输入：nums = [3,4,-1,1]
 * 输出：2
 * 示例 3：
 *
 * 输入：nums = [7,8,9,11,12]
 * 输出：1
 *
 *
 * 提示：
 *
 * 1 <= nums.length <= 5 * 105
 * -231 <= nums[i] <= 231 - 1
 */
public class FirstMissingPositive {

    public static void main(String[] args) {
        int[] nums = {3,4,-1,1};
        System.out.println(firstMissingPositive(nums));
    }

    public static int firstMissingPositive(int[] nums) {
        int tmp;
        for (int i = 0; i < nums.length; ) {
            if(nums[i] < 1 || nums[i] > nums.length){
                nums[i++] = 0;
                continue;
            }
            if(nums[i] == i+1){
                i++;
                continue;
            }
            tmp = nums[nums[i]-1];
            if(tmp == nums[i]){
                nums[i++] = 0;
                continue;
            }
            nums[nums[i]-1] = nums[i];
            nums[i] = tmp;
        }
        for (int i = 0; i < nums.length; i++) {
            if(nums[i] == 0){
                return i+1;
            }
        }
        return nums.length+1;
    }
}
